home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / fdimg / —‹Œêsrc.lzh / ed.c < prev    next >
C/C++ Source or Header  |  1993-01-13  |  19KB  |  1,369 lines

  1. #include    "3DDEF.H"
  2. #include    "GLOBAL.H"
  3. #include    "FORWARD.H"
  4. #include    "XCODE.H"
  5.  
  6. void
  7. ed_ctrl_at()
  8. {
  9. }
  10.  
  11. /* 1ワード左へ */
  12. void
  13. ed_ctrl_a()
  14. {
  15.     if (meta_b_sub_ed() >= 0) {    /* 前のワードを1つ追い越している */
  16.         ctrl_f();        /* 戻す */
  17.     }
  18. #if 0
  19.     ctrl_b();
  20.     if (line_cpx_code() != CR) {
  21.         if (meta_b_sub() >= 0) {    /* 前のワードを1つ追い越している */
  22.             ctrl_f();        /* 戻す */
  23.         }
  24.     }
  25. #endif
  26. }
  27.  
  28. /* 行頭なら行末へ */
  29. /* さも無くば行頭へ */
  30. void
  31. ed_ctrl_b()
  32. {
  33.     if (CPX) {
  34.         ctrl_a();
  35.     } else {
  36.         ctrl_e();
  37.     }
  38. }
  39.  
  40. /* 下ページスクロール */
  41. void
  42. ed_ctrl_c()
  43. {
  44.     ctrl_v1((CWY1-CWY0)+1-CY,0);
  45. }
  46.  
  47. /* 右向き */
  48. void
  49. ed_ctrl_d()
  50. {
  51.     if (TBUFFC) {
  52.         register UINT c,cl;
  53.  
  54.         if (TBUFFC == TBCP) {    /* 右側の確定はない */
  55.                     /* 新しく1文字持ってきて追加する */
  56.             c = line_cpx_code();
  57.             if (xf_append_tb_check(c)) {/* 変換バッファが一杯 */
  58.                 under_print((STR)"変換バッファが一杯です");
  59.                 etc_beep();
  60.                 return;
  61.             }
  62.             if ((c == CR) || (!c)){            /* 行の右端である */
  63.                 if ((c == CR) || (CL->ATO == TAIL)) {
  64.                     etc_beep();
  65.                     return;
  66.                 }
  67.                 ed_ctrl_d0();
  68.                 c = line_cpx_code();
  69.             }
  70.             ed_ctrl_d0();
  71.             TL1 = CL;    /* 変換バッファの終了行 */
  72.             TPX1 = CPX;
  73.             TX1 = CX;
  74.             TY1 = CY;
  75.             TBP1 = ANALYZE[CPX].BPOS;
  76.             xf_append_tb(c);
  77.         } else {        /* 右側の確定がある */
  78.                     /* TBCP を1つ進める */
  79.             xf_forward_tb();
  80.         }
  81.     } else {
  82.         ed_ctrl_d0();
  83.     }
  84. }
  85.  
  86. /* カーソル右 */
  87. void
  88. ed_ctrl_d0()
  89. {
  90.     UBYTE c;
  91.  
  92.     if (((c = line_cpx_1byte()) == EOS) || (c == CR)) {    /* 次行へ */
  93.         if (CL->ATO != TAIL) {
  94.             if ((CY+1) > (CWY1 - CWY0)) {    /* ウインドウ外 */
  95.                 line_seigyou();
  96.                 ed_ctrl_x();
  97.             } else {
  98.                 CY++;
  99.                 CL = CL->ATO;
  100.             }
  101.             CPX = 0;
  102.             line_cl_cl();
  103.             work_line_analyze();
  104.         } else {
  105.             /* 何もしない */
  106.         }
  107.     } else {
  108.         CPX++;
  109.     }
  110.     work_cursor_cpx();
  111.     CX0 = CX;
  112. }
  113.  
  114. /* 上向き */
  115. void
  116. ed_ctrl_e()
  117. {
  118.     if (TBUFFC || TBUFFC_R) {
  119.         xf_ikinari_kakutei();
  120.     }
  121.     if (!CY) {    /* 一番上の行なら取敢えず張り付きスクロール */
  122.         ctrl_x_ctrl_p();
  123.     }
  124.     if (CWY0 != CWY1) {    /* 1行だけのウインドウなら、もう何もしない */
  125.         ctrl_p();
  126.     }
  127. }
  128.  
  129. /* 1ワード右へ */
  130. /* ME と違って、改行の前で止まる */
  131. void
  132. ed_ctrl_f()
  133. {
  134.     if (line_cpx_code() == CR) {
  135.         ctrl_f();
  136.     } else {
  137.         meta_f_sub();
  138.     }
  139. }
  140.  
  141. #if 0
  142. int
  143. ed_ctrl_f_sub()
  144. {
  145.     UINT c;
  146.     int g,g0;
  147.  
  148.     g0 = etc_group(line_cpx_code());
  149.     while(1) {
  150.         if ((((c = line_cpx_code()) == EOS) || (c == CR)) && (CL->ATO == TAIL)) {
  151.             return(-1);    /* 終端である */
  152.         }
  153.         ctrl_f();
  154.         if (!(c = line_cpx_code())) {    /* 行末である */
  155.             ctrl_f();
  156.             c = line_cpx_code();
  157.         }
  158.         g = etc_group(c);
  159.         if (g != g0) {
  160.             return(g);
  161.         }
  162.     }
  163. }
  164. #endif
  165.  
  166.  
  167. /* 吸い込み削除 */
  168. void
  169. ed_ctrl_g()
  170. {
  171.     ctrl_d();
  172. }
  173.  
  174. void
  175. ed_ctrl_h()
  176. {
  177.     if (TBUFFC) {
  178.         xf_delete_tb();
  179.         if (TBCP) {    /* 生がある */
  180.             xf_disp_insert(&TX,&TY);
  181.         } else {    /* 生が無くなった */
  182.             work_replace_str_echo(TL0,TBP0,TL1,TBP1,TBUFF,0,TY0);
  183.             xf_init_tb();
  184.             etc_color(NORMAL);
  185.             disp_half_flush(TL0,TY0);
  186.         }
  187.         return;
  188.     }
  189.     if ((CL != (HEAD->ATO)) || CPX) {    /* テキストの先頭ではない */
  190.         if (CPX) {        /* 行頭ではない */
  191.             ed_ctrl_s();    /* 左に行って */
  192.             ed_ctrl_g();    /* 右側を削除 */
  193.         } else {        /* 行頭である */
  194.             ed_ctrl_s();    /* 前の行の行末へ行く */
  195.             if (line_cpx_code() != CR) {    /* 改行の上でない */
  196.                 ed_ctrl_s();        /* もう一回左へ */
  197.             }
  198.             ed_ctrl_g();    /* 右側を削除 */
  199.         }
  200.         change_check();
  201.     }
  202. }
  203.  
  204. void
  205. ed_ctrl_i()
  206. {
  207.     ctrl_i();
  208. }
  209.  
  210. /* 再変換開始 */
  211. void
  212. ed_ctrl_j_ctrl_d()
  213. {
  214.     ctrl_t_ctrl_f();
  215. }
  216.  
  217. void
  218. ed_ctrl_l()
  219. {
  220.     int cx0;
  221.     UNIT *cl0;
  222.  
  223.     cl0 = CL;
  224.     cx0 = CX0;
  225.  
  226.     ctrl_a();
  227.     ctrl_y();
  228.     jump(cl0,0);            /* 戻る */
  229.     CPX = work_CX0_to_CPX(CX0 = cx0);
  230.     work_cursor_cpx();
  231. }
  232.  
  233. void
  234. ed_ctrl_m()
  235. {
  236.     if (TBUFFC || TBUFFC_R) {
  237.         xf_ikinari_kakutei();
  238.         return;
  239.     }
  240.     if ((CY == CWY1) && (CWY0 != CWY1)) {    /* 最下行で、1行だけのウインドウではない */
  241.         ctrl_x_ctrl_n();
  242.     }
  243.     work_insert1((UBYTE) CR);
  244.     work_cursor_cpx();
  245. }
  246.  
  247. /* 1行挿入 */
  248. void
  249. ed_ctrl_n()
  250. {
  251.     ctrl_a();
  252.     ctrl_o();
  253.     if (line_cpx_code() != CR) {
  254.         ctrl_o();
  255.     }
  256. }
  257.  
  258. void
  259. ed_ctrl_p()
  260. {
  261.     ctrl_e();
  262. }
  263.  
  264. void
  265. ed_ctrl_q()
  266. {
  267.     ctrl_a();
  268. }
  269.  
  270. /* 上ページスクロール */
  271. void
  272. ed_ctrl_r()
  273. {
  274.     ctrl_z0(-(CY +1 +(CWY1-CWY0)));
  275. }
  276.  
  277. /* 左向き */
  278. void
  279. ed_ctrl_s()
  280. {
  281.     UNIT *up;
  282.  
  283. #if 0
  284.     if (TBUFFC) {    /* 変換バッファの右端を確定し、バッファを短くする */
  285.         UBYTE w0[VERY_LONG_LINE*4];
  286.         UINT c,l;
  287.  
  288.         c = xf_back_tb();
  289.         if (TBCP) {    /* 生がある */
  290.             xf_disp_insert(&TX,&TY);
  291.         } else {    /* 生が無くなった */
  292.             work_replace_str_echo(TL0,TBP0,TL1,TBP1,TBUFF,-1,TY0);
  293.             xf_init_tb();
  294.             etc_color(NORMAL);
  295.             disp_half_flush(TL0,TY0);
  296.         }
  297.         return;
  298.     }
  299. #endif
  300.     if (TBUFFC || TBUFFC_R) {
  301.         xf_ikinari_kakutei();
  302.     }
  303.  
  304.     if (!CPX) {    /* 前行へ */
  305.         UNIT *cl0;
  306.  
  307.         cl0 = CL;
  308.         up = CL->MAE;
  309.         if (up != HEAD) {
  310.             CL = up;
  311.             line_cl_cl();
  312.             if (--CY < 0) {    /* ウインドウ外 */
  313.                 CL = cl0;
  314.                 CY = 0;
  315.                 ctrl_x_ctrl_p();
  316.                 if (CWY0 != CWY1) {    /* 1行だけのウインドウなら、もう何もしない */
  317.                     ctrl_p();
  318.                 }
  319.             }
  320.             work_line_analyze();
  321.              CPX = work_CX0_to_CPX(VERY_LONG_LINE);    /* 行末へ */
  322.         } else {
  323.             /* 何もしない */
  324.         }
  325.     } else {
  326.         CPX--;
  327.     }
  328.     work_cursor_cpx();
  329.     CX0 = CX;
  330. }
  331.  
  332. void
  333. ed_ctrl_t()
  334. {
  335.     meta_d_sub(ed_ctrl_f);
  336. }
  337.  
  338. /* カーソル位置より前を削除 */
  339. void
  340. ed_ctrl_u()
  341. {
  342.     meta_d_sub(ctrl_a);
  343. }
  344.  
  345. void
  346. ed_ctrl_v()
  347. {
  348.     ctrl_q();
  349. }
  350.  
  351. /* カーソルが一番下の行でなければ張り付き下向きスクロール */
  352. /* カーソルが一番下の行であれば、カーソルは動かずに下向きスクロール */
  353. void
  354. ed_ctrl_w()
  355. {
  356.     if (line_my_top()->MAE == HEAD) {
  357.         return;
  358.     }
  359.     if (CY == (CWY1-CWY0)) {
  360.         ctrl_p();
  361.     }
  362.     if (CWY0 != CWY1) {    /* 1行だけのウインドウなら、もう何もしない */
  363.         ctrl_x_ctrl_p();
  364.     }
  365. }
  366.  
  367. /* 下向き */
  368. void
  369. ed_ctrl_x()
  370. {
  371.     if (TBUFFC || TBUFFC_R) {
  372.         xf_ikinari_kakutei();
  373.     }
  374.     if (CL->ATO == TAIL) {
  375.         return;
  376.     }
  377.     if (CY == (CWY1-CWY0)) {    /* 最下行ならとりあえず1行張り付きスクロール */
  378.         ctrl_x_ctrl_n();
  379.     }
  380.     if (CWY1 != CWY0) {        /* 1行だけのウインドウなら、もう何もしない */
  381.         ctrl_n();
  382.     }
  383. }
  384.  
  385. void
  386. ed_ctrl_y()
  387. {
  388.     UBYTE c;
  389.     int i;
  390.     int cx0;
  391.  
  392.     buff_clear_cut_buff();
  393.     
  394.     cx0 = CX0;
  395.     ctrl_a();    /* 左端へ跳ぶ */
  396.     c = line_cpx_1byte();
  397.     ctrl_k();
  398.     if (c == CR) {    /* CR だけの行だった */
  399.         change_check();
  400.         work_cursor_cpx();
  401.         return;
  402.     }
  403.     c = line_cpx_1byte();
  404.     if (c == CR) {        /* CR の上なら吸い込み削除と同じ */
  405.                     /* ただし、バッファへ送り込む点は違う */
  406.         int b1,b2;
  407.         UNIT *wp;
  408.  
  409.         wp = CL->ATO;
  410.         b1 = ANALYZE[CPX].BPOS;
  411.         b2 = ANALYZE[CPX+1].BPOS;
  412.         work_delete_cl_between(b1,b2,1);
  413.         if (CL != wp) {
  414.             ctrl_n();
  415.         }
  416.     }
  417.     line_cl_cl();
  418.     work_line_analyze();
  419.     CPX = work_CX0_to_CPX(cx0);
  420.     CX0 = CX = ANALYZE[CPX].XPOS;
  421.     change_check();
  422.     work_cursor_cpx();
  423. }
  424.  
  425. /* カーソルが一番上の行でなければ張り付き上向きスクロール */
  426. /* カーソルが一番上の行であれば、カーソルは動かずに上向きスクロール */
  427. void
  428. ed_ctrl_z()
  429. {
  430.     UNIT *p;
  431.  
  432.     if (((p = line_my_screen(CWY1-CWY0)) == NIL) || (p == NULL) || (p == HEAD) || (p->ATO == TAIL)) {
  433.         return;
  434.     }
  435.     if (!CY) {
  436.         ctrl_n();
  437.     }
  438.     if (CWY1 != CWY0) {        /* 1行だけのウインドウなら、もう何もしない */
  439.         ctrl_x_ctrl_n();
  440.     }
  441. }
  442.  
  443. void
  444. ed_meta_arg0()
  445. {
  446.     ed_meta_argn(0);
  447. }
  448.  
  449. void
  450. ed_meta_arg1()
  451. {
  452.     ed_meta_argn(1);
  453. }
  454.  
  455. void
  456. ed_meta_arg2()
  457. {
  458.     ed_meta_argn(2);
  459. }
  460.  
  461. void
  462. ed_meta_arg3()
  463. {
  464.     ed_meta_argn(3);
  465. }
  466.  
  467. void
  468. ed_meta_arg4()
  469. {
  470.     ed_meta_argn(4);
  471. }
  472.  
  473. void
  474. ed_meta_arg5()
  475. {
  476.     ed_meta_argn(5);
  477. }
  478.  
  479. void
  480. ed_meta_arg6()
  481. {
  482.     ed_meta_argn(6);
  483. }
  484.  
  485. void
  486. ed_meta_arg7()
  487. {
  488.     ed_meta_argn(7);
  489. }
  490.  
  491. void
  492. ed_meta_arg8()
  493. {
  494.     ed_meta_argn(8);
  495. }
  496.  
  497. void
  498. ed_meta_arg9()
  499. {
  500.     ed_meta_argn(9);
  501. }
  502.  
  503. void
  504. ed_meta_argn(int b)
  505. {
  506.     UINT k;
  507.     int w = 0,w0;
  508.  
  509.     etc_set_ed_arg(b);
  510.     disp_cursor_on();    /* カーソルを出す */
  511.     disp_show_cursor();    /* カーソルのブリンクを強制的にオンにする */
  512.     fep_key_clear();    /* キーバッファのクリア */
  513.     k = fep_inkey_raw();
  514.     while(1) {
  515.         while(('0' <= k) && (k <= '9') || (k == 'H'-'@')) {
  516.             /* 数字か BS であり続ける限り */
  517.             if (k == 'H'-'@') {
  518.                 etc_set_ed_arg(w = etc_get_arg()/10);
  519.                 k = fep_inkey_raw();
  520.                 continue;
  521.             }
  522.             w0 = w;
  523.             etc_set_ed_arg(w = etc_get_arg() *10 +(k - '0'));
  524.             if ((w/10) < w0) {
  525.                 w = 0;
  526.                 etc_set_ed_arg(0);
  527.                 k = (UINT) '0';
  528.             } else {
  529.                 k = fep_inkey_raw();
  530.             }
  531.         }
  532.         if ((k == 'M'-'@') || (k == 'I'-'@')
  533.         || (k == 'F') || (k == '\x1b')) {
  534.             break;
  535.         } else if (k == FEP_UNDO_CODE) {
  536.             if (!MACRO_SEQUENCE[0]) {/* ない */
  537.                 etc_get_arg();    /* 回数を捨てる */
  538.             }
  539.             break;
  540.         } else {
  541.             etc_set_ed_arg(etc_get_arg());
  542.             k = fep_inkey_raw();
  543.         }
  544.     }
  545.     if ((k == 'M'-'@') && (w = etc_get_arg())) {
  546.         etc_push_arg(w);
  547.         meta_g();
  548.     } else if (k == 'F') {
  549.         ctrl_x_f();
  550.     } else if (k == 'I' - '@') {
  551.         if (w = etc_get_arg()) {
  552.             etc_push_arg(w);
  553.             ctrl_i();
  554.         } else {
  555.             UBYTE w[MAXLINE];
  556.             sprintf((char *) w,"タブの設定は 1 から %d までです",TAB_LENGTH_LIMIT);
  557.             under_print(w);
  558.         }
  559.     } else if (k == FEP_UNDO_CODE) {
  560.         if (MACRO_SEQUENCE[0]) {    /* マクロが定義されている */
  561.             fep_push_key(k);    /* 戻す */
  562.         } else {
  563.             under_blanc();
  564.         }
  565.     } else {
  566.         etc_get_arg();
  567.         under_blanc();
  568.     }
  569. }
  570.  
  571. /* すべてのファイルをセーブしてから終了 */
  572. void
  573. ed_meta_e()
  574. {
  575.     meta_z();
  576. }
  577.  
  578. void
  579. ed_ctrl_j_ctrl_s()
  580. {
  581.     ctrl_t_ctrl_s();
  582. }
  583.  
  584. void
  585. ed_ctrl_j_ctrl_t()
  586. {
  587.     ctrl_t_ctrl_t();
  588. }
  589.  
  590. void
  591. ed_ctrl_j_click()
  592. {
  593.     ctrl_t_click();
  594. }
  595.  
  596. void
  597. ed_ctrl_j_b()
  598. {
  599.     ctrl_t_b();
  600. }
  601.  
  602. void
  603. ed_ctrl_j_l()
  604. {
  605.     ctrl_t_l();
  606. }
  607.  
  608. void
  609. ed_ctrl_j_l0()
  610. {
  611.     ctrl_t_l0();
  612. }
  613.  
  614. void
  615. ed_ctrl_j_l1()
  616. {
  617.     ctrl_t_l1();
  618. }
  619.  
  620. void
  621. ed_ctrl_j_u()
  622. {
  623.     ctrl_t_u();
  624. }
  625.  
  626. void
  627. ed_ctrl_j_u0()
  628. {
  629.     ctrl_t_u0();
  630. }
  631.  
  632. void
  633. ed_ctrl_j_u1()
  634. {
  635.     ctrl_t_u1();
  636. }
  637.  
  638. void
  639. ed_ctrl_j_w()
  640. {
  641.     ctrl_t_w();
  642. }
  643.  
  644. void
  645. ed_ctrl_j_w0()
  646. {
  647.     ctrl_t_w0();
  648. }
  649.  
  650. void
  651. ed_ctrl_j_w1()
  652. {
  653.     ctrl_t_w1();
  654. }
  655.  
  656. void
  657. ed_ctrl_j_w2()
  658. {
  659.     ctrl_t_w2();
  660. }
  661.  
  662. void
  663. ed_ctrl_j_w3()
  664. {
  665.     ctrl_t_w3();
  666. }
  667.  
  668. void
  669. ed_ctrl_j_cmd()
  670. {
  671.     ctrl_t_cmd();
  672. }
  673.  
  674. void
  675. ed_ctrl_j_me()
  676. {
  677.     ctrl_t_me();
  678. }
  679.  
  680. /* 次検索 */
  681. void
  682. ed_ctrl_j_n()
  683. {
  684.     ed_meta_n_next();
  685. }
  686.  
  687. /* 2重化 */
  688. void
  689. ed_ctrl_j_2()
  690. {
  691.     UNIT *wp;
  692.     UBYTE w0[VERY_LONG_LINE*4];
  693.  
  694.     if ((CL->ATO == TAIL) && (etc_jlast(CL_DATA) != CR)) {
  695.         etc_beep();
  696.         under_print("この行は2重化できません。右端に改行が必要です。");
  697.         return;
  698.     }
  699.     line_seigyou();
  700.     line_get_body(w0,CL);
  701.     if (*w0) {
  702.         wp = line_get_free_and_store(w0);
  703.         line_insert1_after(wp,CL);
  704.     }
  705. }
  706.  
  707. void
  708. ed_meta_a()
  709. {
  710.     ctrl_x_x();
  711. }
  712.  
  713. void
  714. ed_meta_c()
  715. {
  716.     ctrl_x_gyo();
  717. }
  718.  
  719. void
  720. ed_meta_b()
  721. {
  722.     meta_left_blaket();
  723. }
  724.  
  725. void
  726. ed_meta_d()
  727. {
  728.     ctrl_x_b0(1);
  729. }
  730.  
  731. /* 新しいファイルの編集をする */
  732. /* ED は、既にあるファイルに対しては拒絶するケド */
  733. void
  734. ed_meta_f()
  735. {
  736.     ctrl_x_ctrl_f();
  737. }
  738.  
  739. /* 文末への確認置換 */
  740. void
  741. ed_meta_j()
  742. {
  743.     meta_ctrl_r();
  744. }
  745.  
  746. /* 現在編集中のファイルだけを編集前の状態で終了 */
  747. void
  748. ed_meta_k()
  749. {
  750.     if (!ctrl_x_k0(1)) {    /* 移動しなかった,,, */
  751.         ctrl_x_ctrl_c();
  752.     }
  753. }
  754.  
  755. /* 文頭に向かって確認置換 :まだ */
  756. void
  757. ed_meta_l()
  758. {
  759.     ctrl_x_ctrl_r();
  760. }
  761.  
  762. /* 改行記号の表示切り替え */
  763. void
  764. ed_meta_m()
  765. {
  766.     ctrl_t_ctrl_m();
  767. }
  768.  
  769. /* 文末へ向かって文字列検索 */
  770. void
  771. ed_meta_n()
  772. {
  773.     ctrl_s();
  774. }
  775.  
  776. /* 文末へ向かって次を文字列検索 */
  777. void
  778. ed_meta_n_next()
  779. {
  780.     ctrl_s_next();
  781. }
  782.  
  783. /* 現在編集中のファイルを編集前の状態に戻す */
  784. /* 再読み込み */
  785. void
  786. ed_meta_o()
  787. {
  788.     UBYTE c;
  789.     int flag;
  790.  
  791.     while(1) {
  792.         under_print0((STR)"再編集 [Y/N]? ");
  793.         fep_key_clear();
  794.         c = toupper(fep_inkey_raw());
  795.         if (c == 'Y') {
  796.             break;
  797.         } else if (c == 'N') {
  798.             return;
  799.         }
  800.     }
  801.     line_deleten(HEAD,TAIL);
  802.     flag = file_open(TDATA[CURRENT_TEXT].TEXT_FILE,FILE_NAMES[CURRENT_TEXT].CONTENT);
  803.     init_current_screen();
  804.     buff_read_file();    /* カレントファイルをカレントバッファに読み込む */
  805.     file_close(TDATA[CURRENT_TEXT].TEXT_FILE);
  806. }
  807.  
  808. /* 文末に向かって置換 */
  809. void
  810. ed_meta_r()
  811. {
  812.     meta_r();
  813. }
  814.  
  815. /* 文頭に向かって次文字列検索 */
  816. void
  817. ed_meta_s_next()
  818. {
  819.     ctrl_r0(0);
  820. }
  821.  
  822. /* 文頭に向かって文字列検索 */
  823. void
  824. ed_meta_s()
  825. {
  826.     ctrl_r0(1);
  827. }
  828.  
  829. /* 文頭に向かって連続置換:まだ */
  830. void
  831. ed_meta_u()
  832. {
  833.     ctrl_x_r();
  834. }
  835.  
  836. /* タグジャンプ */
  837. void
  838. ed_meta_v()
  839. {
  840.     ctrl_t_v();
  841. }
  842.  
  843. /* 編集中のファイルから一部取り出しファイルを作成 */
  844. void
  845. ed_meta_w()
  846. {
  847.     UBYTE filename[MAXLINE];
  848.     UBYTE w[VERY_LONG_LINE*4];
  849.     UNIT *wp0,*wp1;
  850.     int bp0,bp1;
  851.     int a;
  852.  
  853.     if ((a = etc_get_arg()) >= MAX_MARK) {
  854.         under_print((STR)"マーク番号が不適当です");
  855.         return;
  856.     }
  857.  
  858.     if (wp0 = mark_get_mark(a,&bp0)) {
  859.         line_seigyou();
  860.         sprintf((char *) w,"ファイル書き出し [%s]: ",etc_ret_current_path());
  861.         if (under_input_cr_raw(w,filename) < 0) {    /* 無効であった = ^G */
  862.             under_print((STR)"[中断]");
  863.             return;
  864.         }
  865.         wp1 = CL;
  866.         bp1 = 0;
  867.         if (etc_line_order(&wp0,&bp0,&wp1,&bp1)) {    /* 勝手に入れ替えてくれる */
  868.             buff_save_file(0,wp0,wp1,filename);
  869.         } else {
  870.             error("バグです99");
  871.         }
  872.         work_cursor_cpx();
  873.     } else {
  874.         UBYTE w[MAXLINE];
  875.         sprintf((char *) w,"マーク %1d は設定されていません",a);
  876.         under_print(w);
  877.     }
  878. }
  879.  
  880. /* 現在編集中のファイルをセーブ、削除し、次のファイルへ(無ければ終了) */
  881. void
  882. ed_meta_x()
  883. {
  884.     ctrl_x_ctrl_s();
  885.     if (!ctrl_x_k0(1)) {    /* 移動しなかった */
  886.         ctrl_x_ctrl_c();
  887.     }
  888. }
  889.  
  890. /* esc_] */
  891. /* 大文字小文字変換モードのトグル */
  892. void
  893. ed_meta_KO()
  894. {
  895.     if (ed_big_scall = !ed_big_scall) {    /* 初期値 0 = 大 */
  896.         under_print((STR)"大文字変換モードにしました");
  897.     } else {
  898.         under_print((STR)"小文字変換モードにしました");
  899.     }
  900. }
  901.  
  902. /* 大文字小文字変換 */
  903. void
  904. ed_ctrl_KO()
  905. {
  906.     register UWORD c,c0;
  907.  
  908.     c0 = line_cpx_code();
  909.     if (ed_big_scall) {    /* 大文字変換モード */
  910.         c = etc_toupper(c0);
  911.     } else {        /* 小文字変換モード */
  912.         c = etc_tolower(c0);
  913.     }
  914.      ed_ctrl_KO0(c,c0);
  915. }
  916.  
  917. void
  918. ed_ctrl_KO0(UWORD c,UWORD c0)
  919. {
  920.     STR p;
  921.  
  922.     if (c != c0) {
  923.         change_check();
  924.         p = line_skip_xcode(&CL_DATA[ANALYZE[CPX].BPOS]);
  925.         if (c > 0x100) {
  926.             *p++ = c >> 8;
  927.             *p = c & 0xff;
  928.         } else {
  929.             *p = c;
  930.         }
  931.         line_store_and_echo(CL,CL_DATA);    /* 納める */
  932.         ctrl_f();
  933.         line_cl_cl();
  934.         work_line_analyze();
  935.     } else {
  936.         ctrl_f();
  937.     }
  938.     work_cursor_cpx();
  939. }
  940.  
  941. void
  942. ed_ctrl_o()
  943. {
  944.     xf_dic_learn_mode();
  945. }
  946.  
  947. /* 生入力キャンセル */
  948. void
  949. ed_ctrl_ubar()
  950. {
  951.     ctrl_ubar();
  952. }
  953.  
  954. /* マクロ定義開始/終了 */
  955. void
  956. ed_meta_at()
  957. {
  958.     if (MACRO_DEF_FLAG) {
  959.         ctrl_x_right_braket();
  960.     } else {
  961.         ctrl_x_left_braket();
  962.     }
  963. }
  964.  
  965. /* 範囲削除 */
  966. void
  967. ed_ctrl_j_ctrl_w()
  968. {
  969.     ctrl_w();
  970. }
  971.  
  972. /* 範囲コピー */
  973. void
  974. ed_ctrl_j_esc_w()
  975. {
  976.     meta_w();
  977. }
  978.  
  979. void
  980. ed_ctrl_j_ctrl_y()
  981. {
  982.     ctrl_y();
  983. }
  984.  
  985. /* 行末まで削除 */
  986. void
  987. ed_ctrl_k()
  988. {
  989.     if (line_cpx_code() == CR) {    /* kaigyouno ue dattara nanimosinai */
  990.         return;
  991.     }
  992.     ctrl_k();
  993. }
  994.  
  995. /* バッファの一覧 */
  996. void
  997. ed_ctrl_x_ctrl_b()
  998. {
  999.     ctrl_x_ctrl_b();
  1000. }
  1001.  
  1002. /* 挿入ファイル読み込み */
  1003. void
  1004. ed_ctrl_x_ctrl_i()
  1005. {
  1006.     ctrl_x_ctrl_i();
  1007. }
  1008.  
  1009. /* 指定範囲小文字へ */
  1010. void
  1011. ed_ctrl_x_ctrl_l()
  1012. {
  1013.     ctrl_x_ctrl_l();
  1014. }
  1015.  
  1016. /* 張り付き上スクロール */
  1017. void
  1018. ed_ctrl_x_ctrl_n()
  1019. {
  1020.     ctrl_x_ctrl_n();
  1021. }
  1022.  
  1023. /* 張り付き下スクロール */
  1024. void
  1025. ed_ctrl_x_ctrl_p()
  1026. {
  1027.     ctrl_x_ctrl_p();
  1028. }
  1029.  
  1030. /* 指定範囲大文字へ */
  1031. void
  1032. ed_ctrl_x_ctrl_u()
  1033. {
  1034.     ctrl_x_ctrl_u();
  1035. }
  1036.  
  1037. /* カーソル⇔マーク交換 */
  1038. void
  1039. ed_ctrl_x_ctrl_x()
  1040. {
  1041.     ctrl_x_ctrl_x();
  1042. }
  1043.  
  1044. /* ウインドウ縮小 */
  1045. void
  1046. ed_ctrl_x_ctrl_z()
  1047. {
  1048.     ctrl_x_ctrl_z();
  1049. }
  1050.  
  1051. /* 現在のウインドウを消す */
  1052. void
  1053. ed_ctrl_x_0()
  1054. {
  1055.     ctrl_x_0();
  1056. }
  1057.  
  1058. /* 現在以外のウインドウを消す */
  1059. void
  1060. ed_ctrl_x_1()
  1061. {
  1062.     ctrl_x_1();
  1063. }
  1064.  
  1065. /* 現在のウインドウを2分割 */
  1066. void
  1067. ed_ctrl_x_2()
  1068. {
  1069.     ctrl_x_2();
  1070. }
  1071.  
  1072. /* カーソル位置情報 */
  1073. void
  1074. ed_ctrl_j_equal()
  1075. {
  1076.     ctrl_x_equal();
  1077. }
  1078.  
  1079. /* 次バッファ */
  1080. void
  1081. ed_ctrl_x_b()
  1082. {
  1083.     ctrl_x_b();
  1084. }
  1085.  
  1086. /* カラム数設定 */
  1087. void
  1088. ed_ctrl_x_f()
  1089. {
  1090.     ctrl_x_f();
  1091. }
  1092.  
  1093. /* バッファの削除 */
  1094. void
  1095. ed_ctrl_x_k()
  1096. {
  1097.     ctrl_x_k();
  1098. }
  1099.  
  1100. /* ファイル名変更 */
  1101. void
  1102. ed_ctrl_x_n()
  1103. {
  1104.     ctrl_x_n();
  1105. }
  1106.  
  1107. /* 後のウインドウへ */
  1108. void
  1109. ed_ctrl_x_o()
  1110. {
  1111.     ctrl_x_o();
  1112. }
  1113.  
  1114. /* 前のウインドウへ */
  1115. void
  1116. ed_ctrl_x_p()
  1117. {
  1118.     ctrl_x_p();
  1119. }
  1120.  
  1121. /* ウインドウの拡大 */
  1122. void
  1123. ed_ctrl_x_up_arrow()
  1124. {
  1125.     ctrl_x_up_arrow();
  1126. }
  1127.  
  1128. /* チャイルド(直接)*/
  1129. ed_ctrl_x_doller()
  1130. {
  1131.     ctrl_x_doller();
  1132. }
  1133.  
  1134. /* マークの解除 */
  1135. ed_ctrl_x_space()
  1136. {
  1137.     ctrl_x_space();
  1138. }
  1139.  
  1140. /* */
  1141. void
  1142. ed_meta_i()
  1143. {
  1144.     ctrl_t_ctrl_i();
  1145. }
  1146.  
  1147. /* ファイル読み込み(挿入) */
  1148. /* 行単位である */
  1149. /* CL の前に挿入する */
  1150. /* 挿入後 CL は挿入されたファイルの先頭 */
  1151. void
  1152. ed_meta_y()
  1153. {
  1154.     int t,f;
  1155.     int flag;
  1156.     UBYTE filename[MAXLINE];
  1157.     UBYTE w[MAXLINE];
  1158.     int lc = 0;
  1159.     FILE *fp;
  1160.  
  1161.     UNIT *wp;
  1162.  
  1163.     line_seigyou();
  1164.  
  1165.     sprintf((char *) w,"ファイル挿入 [%s]: ",etc_ret_current_path());
  1166.     if (under_input_cr_raw(w,filename) < 0) {    /* 無効であった = ^G */
  1167.         under_print((STR)"[中断]");
  1168.         return;
  1169.     }
  1170.  
  1171.     fp = fopen((char *)filename,"rb");
  1172.     if (!fp) {
  1173.         under_print((STR)"[ファイルが存在しません]");
  1174.         return;
  1175.     }
  1176.  
  1177.     change_check();
  1178.     init_skip_cnf(fp,w);
  1179.     under_print((STR)"[ファイル挿入中]");
  1180.     wp = CL->MAE;
  1181.     lc = buff_read_file_ins(fp,w,CL);    /* ファイルをカレントバッファに挿入する */
  1182.     jump(wp->ATO,0);
  1183.     disp_cl_y(CY);
  1184.     fclose(fp);
  1185.     sprintf((char *)w,"[挿入 %d 行]",lc);
  1186.     under_print(w);
  1187. }
  1188.  
  1189.  
  1190. /* ホーム位置へ */
  1191. void
  1192. ed_ctrl_j_h()
  1193. {
  1194.     jump(line_my_top(),0);
  1195. }
  1196.  
  1197. /* マークジャンプ */
  1198. void
  1199. ed_meta_ctrl_g()
  1200. {
  1201.     meta_ctrl_g();
  1202. }
  1203.  
  1204. /* カーソル中央 */
  1205. void
  1206. ed_meta_ctrl_l()
  1207. {
  1208.     meta_ctrl_l();
  1209. }
  1210.  
  1211. /* 次ウインドウ次頁 */
  1212. void
  1213. ed_meta_ctrl_v()
  1214. {
  1215.     meta_ctrl_v();
  1216. }
  1217.  
  1218. /* 次ウインドウ前頁 */
  1219. void
  1220. ed_meta_ctrl_z()
  1221. {
  1222.     meta_ctrl_z();
  1223. }
  1224.  
  1225. /* マークセット */
  1226. void
  1227. ed_meta_space()
  1228. {
  1229.     meta_space();
  1230. }
  1231.  
  1232. /* カーソル中央 */
  1233. /*
  1234. void
  1235. ed_meta_gyo()
  1236. {
  1237.     meta_gyo();
  1238. }
  1239. */
  1240.  
  1241. /* セーブ */
  1242. void
  1243. ed_meta_h()
  1244. {
  1245.     ctrl_x_ctrl_s();
  1246. }
  1247.  
  1248. /* 終了 */
  1249. void
  1250. ed_meta_q()
  1251. {
  1252.     ctrl_x_ctrl_c();
  1253. }
  1254.  
  1255. /* ファイル名変更 */
  1256. void
  1257. ed_meta_t()
  1258. {
  1259.     ctrl_x_n();
  1260. }
  1261.  
  1262. /* 文末へ */
  1263. void
  1264. ed_meta_z()
  1265. {
  1266.     meta_right_blaket();
  1267. }
  1268.  
  1269. /* ダミー */
  1270. void
  1271. ed_nop()
  1272. {
  1273. }
  1274.  
  1275. /* 印刷 */
  1276. void
  1277. ed_ctrl_j_p()
  1278. {
  1279.     ctrl_t_p();
  1280. }
  1281.  
  1282. /* 縦書き印刷 */
  1283. void
  1284. ed_ctrl_j_pt()
  1285. {
  1286.     ctrl_t_pt();
  1287. }
  1288.  
  1289. void
  1290. ed_ctrl_j_e()
  1291. {
  1292.     ctrl_x_e();
  1293. }
  1294.  
  1295. void
  1296. ed_ctrl_j_ctrl_l()
  1297. {
  1298.     ctrl_t_ctrl_l();
  1299. }
  1300.  
  1301. void
  1302. ed_ctrl_j_ctrl_r()
  1303. {
  1304.     ctrl_t_ctrl_r();
  1305. }
  1306.  
  1307. /* キーバインド一覧 */
  1308. void
  1309. ed_ctrl_j_a()
  1310. {
  1311.     meta_a();
  1312. }
  1313.  
  1314. void
  1315. ed_ctrl_t_dm()
  1316. {
  1317.     ctrl_t_dm();
  1318. }
  1319.  
  1320.  
  1321. /* 対応する括弧を挿入する */
  1322. void
  1323. ed_ctrl_j_pair_left()
  1324. {
  1325.     ctrl_t_pair_left();
  1326. }
  1327.  
  1328. /* 対応する括弧を挿入する */
  1329. void
  1330. ed_ctrl_j_pair_right()
  1331. {
  1332.     ctrl_t_pair_right();
  1333. }
  1334.  
  1335. /* 字詰め改行書き出し */
  1336. void
  1337. ed_meta_ctrl_w()
  1338. {
  1339.     ctrl_t_ctrl_w();
  1340. }
  1341.  
  1342. /* 範囲内再変換 */
  1343. void
  1344. ed_ctrl_j_t()
  1345. {
  1346.     ctrl_t_t();
  1347. }
  1348.  
  1349. /* カットバッファよりワーク1へ */
  1350. void
  1351. ed_ctrl_j_s1()
  1352. {
  1353.     ctrl_t_s1();
  1354. }
  1355.  
  1356. /* カットバッファよりワーク2へ */
  1357. void
  1358. ed_ctrl_j_s2()
  1359. {
  1360.     ctrl_t_s2();
  1361. }
  1362.  
  1363. /* デバイス書き出し */
  1364. void
  1365. ed_ctrl_j_dev()
  1366. {
  1367.     ctrl_t_dev();
  1368. }
  1369.